/***************************************************************************
 创建者：华磊
 开始时间：         : 2020.12.08
 copyright            : (C) 深圳市华友高科有限公司
 修改说明：（每次有修改就添加一条，带有 修改人，修改时间，修改描述）

 ***************************************************************************
 *   运动指令属性编辑视窗
*                                                                         *
 ***************************************************************************/
#ifndef MOTIONINSTRUCTIONVIEW_H
#define MOTIONINSTRUCTIONVIEW_H

#include "motioninstructionview_global.h"
#include <QWidget>
#include "motioninstruction2view.h"
#include <QStandardItemModel>
#include <QAbstractItemModel>
#include <QTranslator>
#include "../../CommunicateDelegate/hmicommunicate.h"
#include "instructionEnum.h"
#include "motioninstruction.h"

class ProgramView;

namespace Ui {
class MotionInstructionView;
}


/**
 * @brief The MotionInstructionView class　运动指令属性编辑类
 */
class MOTIONINSTRUCTIONVIEWSHARED_EXPORT MotionInstructionView : public QWidget
{
    Q_OBJECT

public:
    MotionInstructionView(int styleId,GlobalData *ioDataIn,QWidget *parent = 0);

    /**
     * @brief updateView            更新设置数据到界面控件上
     */
    void updateView();

    /**
     * @brief updateView            更新界面的 点位数据
     */
    void updateViewPointData();

    /**
     * @brief getInput              获取界面输入数据
     */
    void getInput();

    /**
     * @brief getInput              获取手输入点的数据
     */
    void getInputPointData();

    void initialDisplayStyle(int styleId);

signals:
    void setDefaultJMoveSpeed_signal(double speed);
    void setDefaultLMoveSpeed_signal(double speed,QString unitType);
    /**
     * @brief msgBoxSignal                  通知 打开消息框
     */
    void msgBoxSignal(int type,QString title,QString text);

    /**
     * @brief selectJInstruction            选择J类型指令
     */
    void selectJInstruction();
    /**
     * @brief selectLInstruction            选择L类型指令
     */
    void selectLInstruction();
//    /**
//     * @brief selectCInstruction　选择C类型指令
//     */
//    void selectCInstruction();
//    /**
//     * @brief selectAInstruction　选择A类型指令
//     */
//    void selectAInstruction();

    /**
     * @brief unlockPoint           点锁定与解锁
     */
    void unlockPoint();

    /**
     * @brief recordPoint           载入点
     * @param pointPro              点信息
     */
    void recordPoint_signal(int type, int pointNum);

    /**
     * @brief moveToPoint           移动到点
     * @param pointPro              点信息
     */
    void moveToPointSignal(int type, int pointNum);

    /**
     * @brief moveToPointFinish     移动到点完成
     * @param pointPro
     */
    void moveToPointFinish();

    /**
     * @brief changePointToDeg      转换成 关节点
     * @param pointNum
     */
    void changePointToDeg(int pointNum);
    /**
     * @brief changePointToWorld    转换成 笛卡尔点
     * @param pointNum
     */
    void changePointToWorld(int pointNum);

    /**
     * @brief inputPointTakeEffect  使输入点数据生效
     * @param pointPro              点数据
     */
    void inputPointTakeEffect();

private slots:
    /**
     * @brief on_next_Btn_clicked   下一页槽函数
     */
    void on_next_Btn_clicked();


    /**
     * @brief on_J_radioButton_2_clicked    选择J类型指令槽函数
     */
    void on_J_radioButton_2_clicked();

    /**
     * @brief on_L_radioButton_2_clicked    选择L类型指令槽函数
     */
    void on_L_radioButton_2_clicked();

    /**
     * @brief on_rate_slider_2_sliderMoved  更改速率滑块位置槽函数
     * @param position　当前滑块位置
     */
    void on_rate_slider_2_sliderMoved(int position);

    /**
     * @brief on_lockPoint_Btn_2_clicked    点锁定与解锁切换槽函数
     */
    void on_lockPoint_Btn_2_clicked();

    /**
     * @brief on_recordPoint_Btn_2_clicked  载入点槽函数
     */
    void on_recordPoint_Btn_2_clicked();

    /**
     * @brief on_moveToPoint_Btn_2_pressed  移动到点槽函数
     */
    void on_moveToPoint_Btn_2_pressed();

    /**
     * @brief on_moveToPoint_Btn_2_released 移动到点完成槽函数
     */
    void on_moveToPoint_Btn_2_released();

    /**
     * @brief on_takeEffect_Btn_clicked     使输入点数据生效槽函数
     */
    void on_takeEffect_Btn_clicked();

    /**
     * @brief on_rate_slider_2_valueChanged 速度滑块值改变
     * @param value　速度值
     */
    void on_rate_slider_2_valueChanged(int value);

    /**
     * @brief on_turnToJoint_Btn_clicked    转换成关节点
     */
    void on_turnToJoint_Btn_clicked();
    /**
     * @brief on_turnToDiKa_Btn_clicked     转换成笛卡尔点
     */
    void on_turnToDiKa_Btn_clicked();

    /**
     * @brief on_position_lineEdit_2_textChanged    修改点号的同时 刷新
     * @param arg1
     */
    void on_position_lineEdit_2_textChanged(const QString &arg1);

    /**
     * @brief on_position_comboBox_2_currentIndexChanged        判断点位数据合法性
     * @param index
     */
    void on_position_comboBox_2_currentIndexChanged(int index);

    /**
     * @brief on_position_lineEdit_2_editingFinished            结束判断点位数据合法性
     */
    void on_position_lineEdit_2_editingFinished();

public:
    void setViewText();
    void changeLanguage(int language);
    /**
     * @brief getRrgToIndex         指令下标获取函数
     * @param arg1
     * @return
     */
    int getRrgToIndex(QString arg1);

public:
    MotionInstruction2View *motionInstruction2View;
    ProgramView *programView;

    QStandardItemModel *model;

    QVector <QString > sixAxisName;

    QStringList headLabelV;

    MotionInstruction moIns;

    //************************************
    /**
     * @brief instructionMainFlag   分类:属于_NORMAL还是_STAMP
     */
    int instructionMainFlag;
    //************************************
    /**
     * @brief motionInstruction     运动指令
     */
    QString motionInstruction;

    /**
     * @brief cInstruction          C指令第一个点
     */
    QString cInstruction;

    //************************************
    /**
     * @brief instructionType       指令类型
     */
    QString instructionType;
    /**
     * @brief instructionTypeFlag   指令类型选择标志　1:J  2:L  3:C  4:A
     */
    MOTION_FORMAT instructionTypeFlag;

    /**
     * @brief instructionStampTypeFlag  针对码垛的 8种情况
     */
    int instructionStampTypeFlag;

    /**
     * @brief positionTypeFlag      指令位置类型　0:P  1:PR
     */
    int positionTypeFlag;
    /**
     * @brief positionIndex         指令位置下标
     */
    QString positionIndexStr;
    QString positionIndexAddressStr;

    QString positionTypeStr;
    //************************************
    /**
     * @brief instructionRate       指令速度
     */
    float instructionRate;
    /**
     * @brief rateUnit              速度单位
     */
    QString rateUnit;
    /**
     * @brief rateUnitTypeFlag      速度单位类型
     *
     *   0:%  1:mm/sec  2:cm/min  3:deg/sec  4:sec  5:msec  6:inch/min
     */
    FEED_RATE_FORMAT rateUnitTypeFlag;

    //************************************
    /**
     * @brief instructionFixedPositionType　指令定位类型
     */
    QString instructionFixedPositionType;
    /**
     * @brief fixedPositionTypeFlag　定位类型标志　０：FINE　１：CNT
     */
    int fixedPositionTypeFlag;
    /**
     * @brief cntValue              CNT数值
     */
    int cntValue;

    //************************************
    /**
     * @brief note                  指令注释
     */
//    QString note;

    /**
     * @brief lockBtnPicture        点锁定按钮图片
     */
    QString lockBtnPicture;
    /**
     * @brief lockBtnText           点锁定按钮文字
     */
    QString lockBtnText;

    /**
     * @brief diFlag                DI使用标志
     */
    int isUseDiSkip;
    /**
     * @brief diIndex               DI索引号
     */
    QString diIndex;
    /**
     * @brief diSwitckFlag          DI开关　0:ON  1:OFF
     */
    int diSwitchFlag;
    /**
     * @brief labelIndex            跳转标签号
     */
    QString labelIndex;
    /**
     * @brief diInstruction         DI指令
     */
    QString diInstruction;
    /**
     * @brief diSwitch              DI开关　ON/OFF
     */
    QString diSwitch;


    /**
     * @brief wjntFlag              Wjnt指令添加标志　0:未选中  1: 选中
     */
    int wjntFlag;
    /**
     * @brief incFlag               INC指令添加标志　0:未选中  1: 选中
     */
    int incFlag;
    /**
     * @brief accFlag               ACC指令添加标志　0:未选中  1: 选中
     */
    int accFlag;
    /**
     * @brief offsetFlag            Offset指令添加标志　0:未选中  1: 选中
     */
    int offsetFlag;
    /**
     * @brief toolOffsetFlag        Tool_Offset指令添加标志　0:未选中  1: 选中
     */
    int toolOffsetFlag;
    /**
     * @brief evFlag                EV指令添加标志　0:未选中  1: 选中
     */
    int evFlag;
    /**
     * @brief pthFlag               PTH指令添加标志　0:未选中  1: 选中
     */
    int pthFlag;
    /**
     * @brief wjntInstruction       Wjnt手腕关节动作指令
     */
    QString wjntInstruction;
    /**
     * @brief incInstruction        INC增量指令
     */
    QString incInstruction;
    /**
     * @brief accInstruction        ACC加减速倍率指令
     */
    QString accInstruction;
    /**
     * @brief accValue              ACC加减速倍率值
     */
    int accValue;
    /**
     * @brief offsetInstruction     Offset位置补偿指令
     */
    QString offsetInstruction;
    /**
     * @brief offsetPrIndex         Offset指令位置下标
     */
    QString offsetPrIndex;
    /**
     * @brief toolOffsetInstruction Tool_Offset工具补偿指令
     */
    QString toolOffsetInstruction;
    /**
     * @brief toolOffsetPrIndex     Tool_Offset位置下标
     */
    QString toolOffsetPrIndex;
    /**
     * @brief evInstruction         EV外部轴指令
     */
    QString evInstruction;
    /**
     * @brief eValue                EV附加轴移动最大速度比率
     */
    int evValue;
    /**
     * @brief pthInstruction        PTH路径规划指令
     */
    QString pthInstruction;

    /**
     * @brief pointPro              点数据信息
     */
    PointPro pointProMo;


    QString patternRR;
    QString patternR;
    QString patternC;

private:
    QTranslator translator;
    GlobalData *ioData;
    Ui::MotionInstructionView *ui;

};

#endif // MOTIONINSTRUCTIONVIEW_H
